package cn.onesdream.app.api.service;

import cn.onesdream.app.common.exception.ServiceException;
import cn.onesdream.app.dao.entity.Role;
import cn.onesdream.app.dao.entity.User;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

public interface UserService {
    /**
     * 通过id数组获得用户列表
     * @param userId 用户id数组
     * @return
     */
    List getUserList(Integer userId []);

    /**
     * 通过账户名获取该用户信息
     * @param account 账户名
     * @return 用户信息
     */
    User getUserByAccount(String account);

    /**
     * 通过账户名获取该用户的角色
     * @param account 账户名
     * @return 角色列表
     */
    List<Role> getRoleByAccount(String account);

    /**
     * 生成该用户的最新token，旧token作废，新token存表
     * @param account 账户名
     * @return token字符串
     */
    String createToken(String account);

    /**
     * 根据用户token获取该用户信息
     * @param token 用户凭证
     * @return 用户信息
     */
    User getUserByToken(String token);

    /**
     * 根据用户id获取该用户信息
     * @param userId 用户凭证
     * @return 用户信息
     */
    User getUserById(Integer userId);

    /**
     * 检测该用户是否存在
     * @param account 账户名
     * @return
     */
    Boolean isExistByAccount(String account);

    /**
     * 用该手机号注册新用户
     * @param phoneNum 手机号
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    User insertCommonUserByPhoneNum(String phoneNum);

    /**
     * 通过账户名和密码登陆
     * @param account 账户名
     * @param password 密码
     * @return 用户信息
     * @throws ServiceException
     */
    User loginByPassword(String account, String password) throws ServiceException;

    /**
     * 修改指定账户的密码
     * @param account 账户名
     * @param newPassword 新密码
     * @return
     */
    void changePassword(String account, String newPassword);


    /**
     * 修改用户信息
     * @param account 账户名
     * @param sex 性别（male，female，unknown）
     * @param nickname 昵称
     * @param mobile 手机号
     * @param birthday 生日（yyyy-MM-dd）
     * @param signature 个人签名
     * @param userDescribe 个人介绍
     */
    User changeUserInfo(String account, String sex, String nickname, String mobile, String birthday, String signature, String userDescribe);

    /**
     * 修改用户头像
     * @param account 账户名
     * @param file 头像图片文件
     */
    User changeUserHead(String account, MultipartFile file) throws IOException;
}
